package bil;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Locale;
import javax.swing.JDesktopPane;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

public class Config implements Serializable {

    // Nome da aplicação
    private transient static String appName;
    // Instancia do objeto.
    private transient static Config guiconfig = null;
    // Arquivo de configurações.
    private transient static File arquivo = null;
    // Nome do arquivo de configurações
    private transient static String confName = "config.xml.conf";
    // Componente JDesktopPane da janela principal.
    private transient static JDesktopPane desktop;
    // Informa se deve perguntar antes de sair do sistema.
    private boolean askOnExit;
    // Tempo de espera da Splash
    private long splashTime;
    // User Agent
    private String userAgent;
    // Pasta aonde são salvas as imagens
    private String pastaPadrao;
    // Quantidade de Threads para download
    private int qtdThreads;
    // Tempo de inatividade da conexão
    private int timeOut;
    // Política de arquivos existentes
    private int arqExiste;
    // Tentativas p/ baixar arquivo
    private int qtdTenta;
    // Tempo entre as tentativas
    private int tempoTenta;
    // LAF Quaqua
    private int quaqua;

    public static synchronized Config getInstance(String appNome) {
        if (guiconfig == null) {
            appName = appNome;
            String caminho = System.getProperty("user.home") + File.separator + appName;
            arquivo = new File(caminho + File.separator + confName);

            try {
                // Internacionalização do JOptionPane
                if (Locale.getDefault().getLanguage().equals("pt")) {
                    UIManager.put("OptionPane.yesButtonText", "Sim");
                    UIManager.put("OptionPane.cancelButtonText", "Cancelar");
                    UIManager.put("OptionPane.noButtonText", "Não");
                    UIManager.put("OptionPane.okButtonText", "OK");
                }

                XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(
                        new FileInputStream(arquivo)));
                guiconfig = (Config) decoder.readObject();
                decoder.close();
                guiconfig.salvar();
            } catch (FileNotFoundException ex) {
                try {
                    guiconfig = new Config();
                    new File(caminho).mkdir();
                    arquivo.createNewFile();

                    guiconfig.setAskOnExit(true);

                    guiconfig.setQuaqua(10);

                    guiconfig.setSplashTime(1500);

                    String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; "
                            + "pt-BR) AppleWebKit/532.3 (KHTML, like Gecko) "
                            + "Chrome/4.0.224.2 Safari/532.3";
                    guiconfig.setUserAgent(userAgent);

                    guiconfig.setPastaPadrao(System.getProperty("user.home")
                            + File.separator);

                    guiconfig.setQtdThreads(10);

                    guiconfig.setTimeOut(30);

                    guiconfig.setQtdTenta(0);

                    guiconfig.setTempoTenta(10);

                    guiconfig.salvar();
                } catch (Exception exx) {
                    exx.printStackTrace();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                arquivo.delete();
            }

        }
        return guiconfig;
    }

    public static synchronized Config getInstance() {
        if (appName == null) {
            return getInstance(".javaapp");
        } else {
            return getInstance(appName);
        }
    }

    public void exit() {
        int ret = JOptionPane.YES_OPTION;

        if (askOnExit) {
            ret = JOptionPane.showConfirmDialog(null, "Deseja sair do sistema?",
                    "Sair", JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE, null);
        }

        if (ret == JOptionPane.YES_OPTION) {
            this.salvar();
            System.exit(0);
        }
    }

    public void salvar() {
        try {
            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
                    new FileOutputStream(arquivo)));
            encoder.writeObject(this);
            encoder.flush();
            encoder.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static SimpleDateFormat getSimpleDateFormat() {
        return new SimpleDateFormat("dd/MM/yyyy");
    }

    public static JDesktopPane getDesktop() {
        return desktop;
    }

    public static void setDesktop(JDesktopPane desktop) {
        Config.desktop = desktop;
    }

    public void setSplashTime(long splashTime) {
        this.splashTime = splashTime;
    }

    public long getSplashTime() {
        return splashTime;
    }

    public boolean isAskOnExit() {
        return askOnExit;
    }

    public void setAskOnExit(boolean askOnExit) {
        this.askOnExit = askOnExit;
    }

    public String getUserAgent() {
        return userAgent;
    }

    public void setUserAgent(String user) {
        userAgent = user;
    }

    public String getPastaPadrao() {
        return pastaPadrao;
    }

    public void setPastaPadrao(String pastaPadrao) {
        this.pastaPadrao = pastaPadrao;
    }

    public int getQtdThreads() {
        return qtdThreads;
    }

    public void setQtdThreads(int qtdThreads) {
        this.qtdThreads = qtdThreads;
    }

    public int getTimeOut() {
        return timeOut;
    }

    public void setTimeOut(int timeOut) {
        this.timeOut = timeOut;
    }

    public int getArqExiste() {
        return arqExiste;
    }

    public void setArqExiste(int arqExiste) {
        this.arqExiste = arqExiste;
    }

    public int getQtdTenta() {
        return qtdTenta;
    }

    public void setQtdTenta(int qtdTenta) {
        this.qtdTenta = qtdTenta;
    }

    public int getTempoTenta() {
        return tempoTenta;
    }

    public void setTempoTenta(int tempoTenta) {
        this.tempoTenta = tempoTenta;
    }

    public static boolean haveQuaqua() {
        try {
            Class c = Class.forName("ch.randelshofer.quaqua.QuaquaManager");
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public boolean isQuaquaEnabled() {
        if (quaqua == 1) {
            return true;
        } else {
            return false;
        }
    }

    public void setQuaqua(int quaqua) {
        this.quaqua = quaqua;
    }

    public int getQuaqua() {
        return quaqua;
    }
}
